package com.kuangstudy.service.list;

import com.kuangstudy.entity.Product;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @author 飞哥
 * @Title: 学相伴出品
 * @Description: 我们有一个学习网站：https://www.kuangstudy.com
 * @date 2021/5/25 17:17
 */
@Service
@Log4j2
public class ProductMasterSlaveListService {

    @Autowired
    private RedisTemplate redisTemplate;

    @PostConstruct
    public void initProducts() {
        log.info("启动定时加载特价商品到redis的list中...");
        new Thread(() -> runCourse()).start();
    }

    public void runCourse() {
        while (true) {
            // 1：从数据库中查询出特价商品
            List<Product> productList = this.findProductsDB();

            // 2：删除原来的特价商品 --- Slave集合 -- 注意一定要先缓存B。因为击穿了就会进行到B缓存，所以先让它去缓存数据
            this.redisTemplate.delete("product:list:slave");
            // 3：把特价商品添加到集合中
            this.redisTemplate.opsForList().leftPushAll("product:list:slave", productList);

            // 4：删除原来的特价商品 --- Master集合
            this.redisTemplate.delete("product:list:master");
            // 5：把特价商品添加到集合中
            this.redisTemplate.opsForList().leftPushAll("product:list:master", productList);

            try {
                // 6: 每隔一分钟执行一遍。
                Thread.sleep(1000 * 60);
                log.info("定时刷新特价商品....");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 数据库中查询特价商品
     *
     * @return
     */
    public List<Product> findProductsDB() {
        List<Product> productList = new ArrayList<>();
        for (long i = 1; i <= 100; i++) {
            Product product = new Product();
            product.setId((long) new Random().nextInt(1000));
            product.setPrice((double) i);
            product.setTitle("特价商品" + (i));
            productList.add(product);
        }
        return productList;
    }
}
